Hugo Alonso, Gonzalo Blanca, Pablo Galarón, Raúl Palomo
Introducción 📢
Para analizar y contrastar la afirmación recogida en la noticia de El País (15/01/2024), según la cual “un 44% de los hombres cree que se ha llegado tan lejos en la promoción de la igualdad de las mujeres que ahora se les discrimina a ellos”, hemos seleccionado un conjunto de variables del Estudio CIS nº 3428 que nos permitirán explorar tanto la percepción subjetiva de discriminación como las condiciones objetivas de desigualdad de género.
LAS VARIABLES SELECCIONADAS SON:
SEXO, EDAD, TAMUNI, INGRESHOG, SITLAB, NIVELESTENTREV, RELIGION, ESCIDEOL, ESCFEMINIS, RECUVOTOG → variables sociodemográficas y de contexto para analizar cómo influyen el género, la edad, la clase social, la ideología, la religiosidad y la afinidad política en la percepción de discriminación.
P6_2 → pregunta central que mide si las personas creen que los hombres están ahora discriminados.
P4, P7_1, P7_2, P7_3 → percepción de desigualdad real en salarios, ascensos y oportunidades laborales.
TARHOGENTREV_HH, CUIDADOHIJOS_HH, HIJOMENOR → indicadores objetivos de reparto de tareas domésticas, cuidado y carga familiar.
Objetivo del análisis 🎯
Buscamos comprobar si quienes perciben discriminación hacia los hombres presentan diferencias reales en:
reparto de tareas domésticas,
participación en el cuidado de hijos y personas dependientes,
nivel de desigualdad material y laboral que reconocen.
Note
Además, esperamos que durante el proceso de depuración aparezcan evidencias que muestren si esa percepción depende más de factores ideológicos (ESCIDEOL, ESCFEMINIS, RELIGION, RECUVOTOG) que de la situación objetiva.
Hipótesis iniciales 💡
Es probable que sean más los hombres que las mujeres quienes perciban discriminación contra los hombres.
Esperamos encontrar que quienes expresan esa percepción:
dedican menos tiempo al hogar y al cuidado que sus parejas mujeres,
reconocen menos desigualdad en salario y oportunidades laborales,
se ubican ideológicamente más a la derecha y son menos afines al feminismo.
Los factores objetivos (ingresos, hijos, tareas domésticas) probablemente no expliquen esa percepción tanto como los factores ideológicos.
Librerías 📚
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.5
✔ forcats 1.0.0 ✔ stringr 1.5.0
✔ ggplot2 3.5.1 ✔ tibble 3.2.1
✔ lubridate 1.9.3 ✔ tidyr 1.3.1
✔ purrr 1.0.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
Attaching package: 'dbscan'
The following object is masked from 'package:stats':
as.dendrogram
library(naniar)
Attaching package: 'naniar'
The following object is masked from 'package:skimr':
n_complete
library(psych)
Attaching package: 'psych'
The following objects are masked from 'package:ggplot2':
%+%, alpha
library(VIM)
Loading required package: colorspace
Loading required package: grid
VIM is ready to use.
Suggestions and bug-reports can be submitted at: https://github.com/statistikat/VIM/issues
Attaching package: 'VIM'
The following object is masked from 'package:dbscan':
kNN
The following object is masked from 'package:datasets':
sleep
library(mice)
Warning in check_dep_version(): ABI version mismatch:
lme4 was built with Matrix ABI version 1
Current Matrix ABI version is 0
Please re-install lme4 from source or restore original 'Matrix' package
Attaching package: 'mice'
The following object is masked from 'package:stats':
filter
The following objects are masked from 'package:base':
cbind, rbind
Carga de datos y selección de variables
Cargamos la base de datos con read_csv2 que nos identifica el ; como delimitador.
ℹ Using "','" as decimal and "'.'" as grouping mark. Use `read_delim()` for more control.
Rows: 4005 Columns: 232
── Column specification ────────────────────────────────────────────────────────
Delimiter: ";"
dbl (230): ESTU, REGISTRO, CUES, CCAA, PROV, MUN, CAPITAL, TAMUNI, ENTREV, T...
lgl (2): IA_OBS1, IA_OBS2
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Important
Nos dimos cuenta de que la variable original HIJOMENOR estaba mal codificada y no reflejaba bien la realidad.
Por eso, usamos HIJOMENOR_1 (si tiene hijos menores) y HIJOMENOR_99 (si respondió la pregunta) para reconstruirla.
Con este código, asignamos NA a quienes no contestaron y usamos el valor correcto de quienes sí respondieron. Así aseguramos que la variable esté limpia y lista para el análisis.
Seleccionamos las variables que hemos dicho antes.
data_num <- data_num |>select( SEXO, # P0a → Sexo EDAD, # P0b → Edad TAMUNI, # Tamaño del municipio INGRESHOG, # P29 → Ingresos del hogar TARHOGENTREV_HH, # Horas dedicadas al hogar (persona entrevistada) HIJOMENOR, # Tiene hijos menores o no SITLAB, # P28 → Situación laboral NIVELESTENTREV, # P26a → Nivel de estudios P6_2, # Opinión: se discrimina a hombres P4, # Grado de desigualdad en España P7_1, # Salarios mujeres vs hombres P7_2, # Ascenso laboral mujeres vs hombres P7_3, # Oportunidades empleo mujeres vs hombres ESCFEMINIS, # Escala autodefinición feminista ESCIDEOL, # Escala ideológica RELIGION, # Religiosidad CUIDADOHIJOS_HH, # Horas cuidado hijos/as RECUVOTOG # Recuerdo de voto en elecciones generales )
¿De que tipo son nuestras variables?
Las variables son las siguientes:
CUALITATIVAS
SEXO → cualitativa nominal (sexo del entrevistado)
TAMUNI → cualitativa ordinal (tamaño del municipio)
INGRESHOG → cualitativa ordinal (ingresos del hogar)
HIJOMENOR → cualitativa nominal (si tiene hijos/as menores)
SITLAB → cualitativa nominal (situación laboral)
NIVELESTENTREV → cualitativa nominal (nivel de estudios)
GRADACDISC(p6_2) → cualitativa ordinal (grado de acuerdo de la afirmación)
GRADODESIGUALDAD(p4) → cualitativa ordinal (grado de desigualdad percibida entre hombres y mujeres en España)
VALSALARIOS(p7_1) → cualitativa ordinal (valoración de la situación de las mujeres respecto de los hombres en los salarios)
VALPOSASC(p7_2) → cualitativa ordinal (valoración de la situación de las mujeres respecto de los hombres en las posibilidades de ascenso en el trabajo)
VALOPEMP(p7_3) → cualitativa ordinal (valoración de la situación de las mujeres respecto de los hombres en las oportunidades para encontrar empleo)
CUIDADOHIJOS_HH → cuantitativa discreta (horas dedicadas al cuidado de hijos)
Recodificación de las variables ♻️
Este proceso es clave porque, si lo hacemos bien ahora, nos ahorrará mucho tiempo y problemas en el análisis posterior.
NS/NS/NO PROCEDE ->> NA
En este paso calculamos el porcentaje de respuestas “No sabe / No contesta” para cada variable y, al comprobar que es bajo, las recodificamos como NA. Esto limpia la base de datos y nos permite trabajar solo con respuestas válidas en los análisis posteriores.
Note
Hemos tenido en cuenta el significado de cada variable para decidir si recodificar las respuestas “No sabe / No contesta” como NA o mantenerlas como una categoría válida. Por ejemplo, en RECUVOTOG, nos interesa conservar el “No contesta” como categoría analizable, mientras que el “No recuerda” lo recodificamos como NA porque no aporta información útil al análisis.
variables_analizar <-c("SEXO", "EDAD", "TAMUNI", "INGRESHOG", "TARHOGENTREV_HH","HIJOMENOR", "SITLAB", "NIVELESTENTREV", "P6_2", "P4", "P7_1", "P7_2","P7_3", "ESCFEMINIS", "ESCIDEOL", "RELIGION", "CUIDADOHIJOS_HH", "RECUVOTOG")# Recorremos cada variable y mostramos proporcionesfor (var in variables_analizar) {cat("\nVariable:", var, "\n")print(prop.table(table(data_num[[var]])))}
data_num <- data_num |>mutate(INGRESHOG =ifelse(INGRESHOG %in%c(8, 9), NA, INGRESHOG),TARHOGENTREV_HH =ifelse(TARHOGENTREV_HH %in%c(98, 99), NA, TARHOGENTREV_HH),SITLAB =ifelse(SITLAB ==9, NA, SITLAB),NIVELESTENTREV =ifelse(NIVELESTENTREV %in%c(98, 99), NA, NIVELESTENTREV),P6_2 =ifelse(P6_2 %in%c(8, 9), NA, P6_2),P4 =ifelse(P4 %in%c(8, 9), NA, P4),P7_1 =ifelse(P7_1 %in%c(8, 9), NA, P7_1),P7_2 =ifelse(P7_2 %in%c(8, 9), NA, P7_2),P7_3 =ifelse(P7_3 %in%c(8, 9), NA, P7_3),ESCFEMINIS =ifelse(ESCFEMINIS %in%c(98, 99), NA, ESCFEMINIS),ESCIDEOL =ifelse(ESCIDEOL %in%c(98, 99), NA, ESCIDEOL),RELIGION =ifelse(RELIGION ==9, NA, RELIGION),CUIDADOHIJOS_HH =ifelse(CUIDADOHIJOS_HH %in%c(96, 98, 99), NA, CUIDADOHIJOS_HH), #TENER EN CUENTA EL 16 PARA FUTUROS ANÁLISIS, depende de si responde que tiene hijos o no, var hijomenorRECUVOTOG =ifelse(RECUVOTOG ==9998, NA, RECUVOTOG) )
Important
En el análisis observamos que el valor 96 tiene un porcentaje muy alto en la variable CUIDADOSHIJOS_HH, pero aun así decidimos recodificarlo como NA. Esto se debe a que este valor representa a personas que no tienen hijos, por lo que la variable depende directamente de HIJOMENOR. Cuando trabajemos con esta variable en análisis futuros, no vamos a imputar los NA; en su lugar, filtraremos los datos usando la variable HIJOMENOR para asegurarnos de incluir solo los casos relevantes.
Sucede lo mismo con la variable RECUVOTOG, donde el 0 significa los que no tenemos info de su voto, pero en vez de pasarlo a na nos creamos un tipo nuevo porque tenemos la suerte de que es cualitativa y no afecta igual que con las cuantitativas.
Conversión a factores con labels
Recodificamos las variables cualitativas. Las variables P…, las ponemos un nombre acorde a su significado.
data_num <- data_num |>mutate(SEXO =factor(SEXO, levels =c(1, 2), labels =c("Hombre", "Mujer")), # nominalTAMUNI =factor(TAMUNI, levels =7:1, labels =c(">1000000 habitantes", "400001-1000000 habitantes", "100001-400000 habitantes", "50001-100000 habitantes", "10001-50000 habitantes", "2001-10000 habitantes", "≤2000 habitantes"),ordered =TRUE), # ordinalINGRESHOG =factor(INGRESHOG, levels =1:6,labels =c("Más de 5000€", "3901-5000€", "2701-3900€", "1801-2700€", "1100-1800€", "Menos de 1100€"),ordered =TRUE), # ordinalHIJOMENOR =factor(HIJOMENOR, levels =c(1, 2),labels =c("Tiene hijos/as menores", "Ninguno")), # nominal SITLAB =factor(SITLAB, levels =1:8,labels =c("Trabaja", "Jubilado/a o pensionista (ha trabajado)", "Pensionista (no ha trabajado)", "En paro, ha trabajado antes", "En paro, busca primer empleo", "Estudiante", "Trabajo doméstico no remunerado", "Otra situación")), # nominalNIVELESTENTREV =factor(NIVELESTENTREV, levels =1:16,labels =c("Menos de 5 años escolarización", "Primaria", "FP básica", "Educación secundaria", "FP grado medio", "Bachillerato", "FP grado superior", "Arquitectura/ingeniería técnica", "Diplomaturas oficiales", "Grado universitario", "Licenciatura", "Arquitectura/ingeniería", "Máster oficial", "Doctorado", "Títulos propios posgrado", "Otros estudios")), # nominalGRADACDISC =factor(GRADACDISC, levels =5:1, labels =c("Nada de acuerdo", "Poco de acuerdo", "Regular", "Bastante de acuerdo", "Muy de acuerdo"),ordered =TRUE), # ordinalGRADODESIGUALDAD =factor(GRADODESIGUALDAD, levels =4:1, labels =c("Casi inexistentes", "Pequeñas", "Bastante grandes", "Muy grandes"),ordered =TRUE), # ordinalVALSALARIOS =factor(VALSALARIOS, levels =3:1,labels =c("Peor", "Igual", "Mejor"),ordered =TRUE), # ordinalVALPOSASC =factor(VALPOSASC, levels =3:1,labels =c("Peor", "Igual", "Mejor"),ordered =TRUE), # ordinalVALOPEMP =factor(VALOPEMP, levels =3:1,labels =c("Peor", "Igual", "Mejor"),ordered =TRUE), # ordinalRELIGION =factor(RELIGION, levels =1:6,labels =c("Católico/a practicante", "Católico/a no practicante", "Creyente de otra religión", "Agnóstico/a", "Indiferente, no creyente", "Ateo/a")), # nominalRECUVOTOG =factor(RECUVOTOG, levels =c(1, 2, 3, 6, 21, 503, 901, 902, 1201, 1501, 1601, 1602,8995, 8996, 9977, 9999),labels =c('PSOE (PSC, PSE-EE, PSdeG, PSIB, PSN)','PP','VOX','PACMA','SUMAR (Podemos, IU, Más País, etc.)','CCa (Coalición Canaria)','ERC (Esquerra Republicana)','JUNTS (Junts per Catalunya)','BNG (Bloque Nacionalista Galego)','UPN (Unión del Pueblo Navarro)','EAJ-PNV (Partido Nacionalista Vasco)','EH Bildu (Euskal Herria Bildu)','Otro partido','En blanco','Voto nulo','N.C.')) # nominal )
Comprobamos
data_num |>distinct(SEXO)
# A tibble: 2 × 1
SEXO
<fct>
1 Mujer
2 Hombre
data_num |>distinct(TAMUNI)
# A tibble: 7 × 1
TAMUNI
<ord>
1 100001-400000 habitantes
2 2001-10000 habitantes
3 10001-50000 habitantes
4 50001-100000 habitantes
5 ≤2000 habitantes
6 400001-1000000 habitantes
7 >1000000 habitantes
data_num |>distinct(INGRESHOG)
# A tibble: 7 × 1
INGRESHOG
<ord>
1 2701-3900€
2 1801-2700€
3 <NA>
4 1100-1800€
5 Más de 5000€
6 3901-5000€
7 Menos de 1100€
data_num |>distinct(HIJOMENOR)
# A tibble: 3 × 1
HIJOMENOR
<fct>
1 Tiene hijos/as menores
2 Ninguno
3 <NA>
data_num |>distinct(SITLAB)
# A tibble: 9 × 1
SITLAB
<fct>
1 Trabaja
2 Estudiante
3 En paro, ha trabajado antes
4 Trabajo doméstico no remunerado
5 En paro, busca primer empleo
6 Jubilado/a o pensionista (ha trabajado)
7 Otra situación
8 Pensionista (no ha trabajado)
9 <NA>
data_num |>distinct(NIVELESTENTREV)
# A tibble: 17 × 1
NIVELESTENTREV
<fct>
1 Grado universitario
2 FP grado superior
3 Diplomaturas oficiales
4 Bachillerato
5 Máster oficial
6 Educación secundaria
7 Doctorado
8 Primaria
9 FP grado medio
10 Licenciatura
11 Menos de 5 años escolarización
12 Arquitectura/ingeniería técnica
13 Arquitectura/ingeniería
14 FP básica
15 Títulos propios posgrado
16 <NA>
17 Otros estudios
data_num |>distinct(GRADACDISC)
# A tibble: 6 × 1
GRADACDISC
<ord>
1 Nada de acuerdo
2 Muy de acuerdo
3 Poco de acuerdo
4 Bastante de acuerdo
5 Regular
6 <NA>
data_num |>distinct(GRADODESIGUALDAD)
# A tibble: 5 × 1
GRADODESIGUALDAD
<ord>
1 Muy grandes
2 Pequeñas
3 Bastante grandes
4 Casi inexistentes
5 <NA>
data_num |>distinct(VALSALARIOS)
# A tibble: 4 × 1
VALSALARIOS
<ord>
1 Peor
2 Igual
3 Mejor
4 <NA>
data_num |>distinct(VALPOSASC)
# A tibble: 4 × 1
VALPOSASC
<ord>
1 Peor
2 Igual
3 Mejor
4 <NA>
data_num |>distinct(VALOPEMP)
# A tibble: 4 × 1
VALOPEMP
<ord>
1 Peor
2 Igual
3 Mejor
4 <NA>
data_num |>distinct(RELIGION)
# A tibble: 7 × 1
RELIGION
<fct>
1 Católico/a practicante
2 Católico/a no practicante
3 Ateo/a
4 Agnóstico/a
5 Indiferente, no creyente
6 <NA>
7 Creyente de otra religión
data_num |>distinct(RECUVOTOG)
# A tibble: 17 × 1
RECUVOTOG
<fct>
1 <NA>
2 PP
3 PSOE (PSC, PSE-EE, PSdeG, PSIB, PSN)
4 Otro partido
5 En blanco
6 SUMAR (Podemos, IU, Más País, etc.)
7 N.C.
8 VOX
9 Voto nulo
10 PACMA
11 CCa (Coalición Canaria)
12 ERC (Esquerra Republicana)
13 JUNTS (Junts per Catalunya)
14 BNG (Bloque Nacionalista Galego)
15 EAJ-PNV (Partido Nacionalista Vasco)
16 EH Bildu (Euskal Herria Bildu)
17 UPN (Unión del Pueblo Navarro)
Las variables cualitativas están correctamente codificadas. Sin embargo, en las continuas detectamos anomalías en TARHOGENTREV_HH y CUIDADOSHIJOS_HH.
summary(data_num)
SEXO EDAD TAMUNI
Hombre:2013 Min. :16.00 >1000000 habitantes :455
Mujer :1992 1st Qu.:37.00 400001-1000000 habitantes:353
Median :50.00 100001-400000 habitantes :993
Mean :50.02 50001-100000 habitantes :551
3rd Qu.:63.00 10001-50000 habitantes :986
Max. :97.00 2001-10000 habitantes :477
≤2000 habitantes :190
INGRESHOG TARHOGENTREV_HH HIJOMENOR
Más de 5000€ :408 Min. : 0.000 Tiene hijos/as menores:1067
3901-5000€ :595 1st Qu.: 1.000 Ninguno :2930
2701-3900€ :891 Median : 2.000 NA's : 8
1801-2700€ :879 Mean : 2.401
1100-1800€ :716 3rd Qu.: 3.000
Menos de 1100€:329 Max. :24.000
NA's :187 NA's :204
SITLAB NIVELESTENTREV
Trabaja :2373 Licenciatura : 634
Jubilado/a o pensionista (ha trabajado): 868 Bachillerato : 585
En paro, ha trabajado antes : 300 FP grado superior : 517
Estudiante : 176 Educación secundaria: 492
Trabajo doméstico no remunerado : 128 Máster oficial : 374
(Other) : 155 (Other) :1374
NA's : 5 NA's : 29
GRADACDISC GRADODESIGUALDAD VALSALARIOS VALPOSASC
Nada de acuerdo :1303 Casi inexistentes: 542 Peor :2465 Peor :2360
Poco de acuerdo :1102 Pequeñas :1044 Igual:1323 Igual:1297
Regular : 37 Bastante grandes :1681 Mejor: 139 Mejor: 267
Bastante de acuerdo: 778 Muy grandes : 636 NA's : 78 NA's : 81
Muy de acuerdo : 754 NA's : 102
NA's : 31
VALOPEMP ESCFEMINIS ESCIDEOL RELIGION
Peor :1851 Min. : 0.000 Min. : 1.00 Católico/a practicante : 636
Igual:1731 1st Qu.: 5.000 1st Qu.: 3.00 Católico/a no practicante:1372
Mejor: 357 Median : 7.000 Median : 5.00 Creyente de otra religión: 134
NA's : 66 Mean : 6.267 Mean : 4.77 Agnóstico/a : 592
3rd Qu.: 8.000 3rd Qu.: 7.00 Indiferente, no creyente : 519
Max. :10.000 Max. :10.00 Ateo/a : 692
NA's :59 NA's :218 NA's : 60
CUIDADOHIJOS_HH RECUVOTOG
Min. : 0.000 PSOE (PSC, PSE-EE, PSdeG, PSIB, PSN):988
1st Qu.: 2.000 PP :854
Median : 4.000 SUMAR (Podemos, IU, Más País, etc.) :524
Mean : 5.158 N.C. :338
3rd Qu.: 6.000 VOX :265
Max. :24.000 (Other) :371
NA's :3003 NA's :665
TARHOGENTREV_HH(horas dedicadas a tareas del hogar): presenta un valor máximo de 24, lo que implicaría dedicar todo el día a estas tareas, algo poco realista. Este valor se aleja mucho de la media (2,41), la mediana (2) y el tercer cuartil (3).
Warning: Removed 204 rows containing non-finite outside the scale range
(`stat_count()`).
El histograma muestra que la gran mayoría dedica entre 0 y 5 horas a tareas del hogar y valor máximo de 24h esta aislado y sin continuidad en la distribuciónEste dato es poco plausible, por lo que seguramente se trate de un error, asi que vamos a pasarlo a NA directamente.
CUIDADOHIJOS_HH(horas dedicadas al cuidado de los hijos): también tiene un máximo de 24, pero en este caso es plausible, especialmente en familias con recién nacidos. No obstante, sigue siendo un valor extremo frente a la media (5,16), la mediana (4) y el tercer cuartil (6).
Warning: Removed 3003 rows containing non-finite outside the scale range
(`stat_count()`).
En este caso, los valores de 24 h podrían formar parte natural de la distribución, que muestra una clara cola derecha. A diferencia del caso anterior, no es un valor aislado, sino una respuesta que se repite. Por ello, no lo consideraremos un error y lo mantendremos, aunque lo tendremos en cuenta en futuros análisis.
Detección de outliers 🔍
Univariante
Aplicamos la función que nos calcula los valores atípicos y extremos.
source("Funcion_atipicos.R")numeric_integer_vars <-names(which(sapply(data_num, is.numeric) |sapply(data_num, is.integer)))# Aplicar la función 'outliers' a cada una de las variables numéricasoutliers_results <-lapply(numeric_integer_vars, function(var) {outliers(data_num, var) # Llamar a la función pasando el nombre de la variable})
📌 Outliers identified in EDAD : 0 outliers
📊 Proportion (%) of outliers: 0 %
🚨 Extreme values identified in EDAD : 0 extreme values
📊 Proportion (%) of extreme values: 0 %
Warning: Removed 210 rows containing non-finite outside the scale range
(`stat_bin()`).
Warning: Removed 210 rows containing non-finite outside the scale range
(`stat_boxplot()`).
📌 Outliers identified in TARHOGENTREV_HH : 109 outliers
📊 Proportion (%) of outliers: 2.87 %
🚨 Extreme values identified in TARHOGENTREV_HH : 34 extreme values
📊 Proportion (%) of extreme values: 0.9 %
Warning: Removed 59 rows containing non-finite outside the scale range
(`stat_bin()`).
Warning: Removed 59 rows containing non-finite outside the scale range
(`stat_boxplot()`).
📌 Outliers identified in ESCFEMINIS : 346 outliers
📊 Proportion (%) of outliers: 8.77 %
🚨 Extreme values identified in ESCFEMINIS : 0 extreme values
📊 Proportion (%) of extreme values: 0 %
Warning: Removed 218 rows containing non-finite outside the scale range
(`stat_bin()`).
Warning: Removed 218 rows containing non-finite outside the scale range
(`stat_boxplot()`).
📌 Outliers identified in ESCIDEOL : 0 outliers
📊 Proportion (%) of outliers: 0 %
🚨 Extreme values identified in ESCIDEOL : 0 extreme values
📊 Proportion (%) of extreme values: 0 %
Warning: Removed 3003 rows containing non-finite outside the scale range
(`stat_bin()`).
Warning: Removed 3003 rows containing non-finite outside the scale range
(`stat_boxplot()`).
📌 Outliers identified in CUIDADOHIJOS_HH : 67 outliers
📊 Proportion (%) of outliers: 6.69 %
🚨 Extreme values identified in CUIDADOHIJOS_HH : 35 extreme values
📊 Proportion (%) of extreme values: 3.49 %
⬇️⬇️⬇️
Mirando los boxplots, observamos que las variables TARHOGENTREV_HH, ESCFEMINIS y CUIDADOHIJOS_HH presentan datos que podrían considerarse atípicos. Sin embargo, antes de clasificarlos directamente como tales, es importante analizar si realmente lo son.
Para ello, comenzaremos revisando los histogramas de cada variable, ya que es posible que esos valores simplemente formen parte de una distribución asimétrica y no correspondan necesariamente a anomalías. Además, analizaremos los porcentajes de casos que representan esos valores “atípicos” dentro de la base de datos, para valorar si, por su peso relativo, pueden considerarse datos típicos del conjunto. Vamos a mirarlo variable por variable.
No obstante, corroboraremos nuestras hipótesis del univariante al hacer el análisis multivariante y ya tomar la decisión de que hacer con ellos.
El porcentaje de atípicos es del 3,03% y de extremos del 1,05%, lo cual entra dentro del rango que suele considerarse aceptable (entre un 2% y un 5%), aunque no conviene aplicar esta regla de forma automática. Si miramos el histograma, vemos que los outliers están entre 7 y 10 horas, mientras que los extremos van de 10 a 18 horas. Teniendo en cuenta que la variable mide el número de horas dedicadas al hogar, a partir de unas 12 horas ya podríamos decir que es bastante inusual.
En el histograma se nota claramente que los extremos están muy lejos del resto de los datos, lo que hace pensar que sería buena idea apartarlos o quitarlos del análisis. En cambio, los outliers, aunque altos, parecen formar parte de la cola natural de la distribución y probablemente reflejen simplemente que algunas personas dedican mucho más tiempo al hogar. Además, siendo un 3,03% frente al 1,05% de los extremos, parece razonable quedarse con los outliers, ya que dedicar entre 7 y 10 horas puede ser mucho, pero no algo súper exagerado.
No obstante, tendremos esto en cuenta pero tomaremos la decisión final en el análisis bivariante. Si no encontramos asociación con ninguna variable, al ser el porcentaje relativamente bajo, nos desprenderemos de ellos.
📌 Outliers identified in ESCFEMINIS : 346 outliers 📊 Proportion (%) of outliers: 8.77 %
🚨 Extreme values identified in ESCFEMINIS : 0 extreme values 📊 Proportion (%) of extreme values: 0 %
En esta variable no encontramos valores extremos, aunque sí aparece un porcentaje relativamente alto de outliers, con un 8,77%. La variable mide en una escala del 0 al 10 el nivel de feminismo percibido, donde 0 es “nada feminista” y 10 es “muy feminista”, preguntando a las personas dónde se ubican. Vemos que todos los outliers se concentran en el valor 0, lo cual es bastante interesante porque probablemente esté relacionado con alguna otra variable, ya que si miramos el histograma, la barra del 0 es igual de alta que muchas otras y no destaca visualmente como algo raro.
Viendo el alto porcentaje y que todos corresponden al cero, parece haber una asociación y no vamos a tener que quitarlos, en el bivariante veremos.
📌 Outliers identified in CUIDADOHIJOS_HH : 67 outliers 📊 Proportion (%) of outliers: 6.69 %
🚨 Extreme values identified in CUIDADOHIJOS_HH : 35 extreme values 📊 Proportion (%) of extreme values: 3.49 %
En esta variable tenemos un 6,69% de outliers y un 3,49% de extremos, lo que ya empieza a salirse un poco del rango típico del 2-5%. La variable mide el número de horas dedicadas al cuidado de los hijos en el hogar, y cuando miramos los datos vemos valores altos como 13, 16, 20 y hasta 24 horas. Si pensamos en hogares con recién nacidos o bebés, tiene todo el sentido que se reporten valores tan elevados, porque básicamente alguien está pendiente de ellos casi las 24 horas del día.
Además, estos valores parecen formar parte de una distribución asimétrica, donde la cola se alarga hacia la derecha con esas horas tan altas. Por eso, nosotros de momento no los quitaríamos, ya que reflejan una situación real y relevante, aunque lo ideal será mirarlo más a fondo en el análisis bivariante para ver si realmente tienen un impacto importante o si están relacionados con otras variables.
Bivariante
En esta parte vamos a ir gráfico por gráfico para ver si los posibles outliers que detectamos antes forman parte de alguna asociación entre variables. La idea es ver si esos valores extremos tienen sentido dentro de un patrón más amplio o si realmente se salen por completo y hay que quitarlos.
Warning
Vamos a hacer los gráficos solo para cualitativas porque para cuaanti vs cuanti salen muy mal ya que las variables son cuantitativas discretas. Un ejemplo de lo que comentamos:
ggplot(data_num,aes(CUIDADOHIJOS_HH, TARHOGENTREV_HH)) +geom_point() +stat_smooth(method ="lm",formula = y ~ x,geom ="smooth")
Warning: Removed 3021 rows containing non-finite outside the scale range
(`stat_smooth()`).
Warning: Removed 3021 rows containing missing values or values outside the scale range
(`geom_point()`).
Warning: Removed 210 rows containing non-finite outside the scale range
(`stat_boxplot()`).
Los valores extremos de la variable TARHOGENTREV_HH no pueden explicarse claramente mediante ninguna de las variables categóricas analizadas. Aparecen de forma dispersa en todos los grupos, aunque algunas variables como situación laboral o percepción de desigualdad muestran ligeras asociaciones, pero no suficientes para justificar los valores atípicos más altos.
Hemos decidido tratar los valores extremos de la variable TARHOGENTREV_HH para que no distorsionen los análisis. En total detectamos 115 outliers, pero solo 40 eran realmente extremos, porque estaban muy por encima de lo normal (más allá de Q3 + 3·IQR). En lugar de eliminarlos todos o inventar valores, lo que hicimos fue reemplazar solo esos 40 casos por NA. DEJAMOS OUTLIERS Y QUITAMOS EXTREMOS.
Note
Los vamos a quitar después del LOF ya que si los pasamos a na antes, el lof quita los na y no nos selecciona los datos puros.
Observar donde exactamente están nuestros outliers nos sirve para ver estas relaciones más claras.
Warning: Removed 59 rows containing non-finite outside the scale range
(`stat_boxplot()`).
Los valores atípicos de 0 en la variable ESCFEMINIS (escala de autodefinición feminista) no parecen ser errores de codificación, sino respuestas intencionadas y coherentes por parte de ciertos perfiles ideológicos. Al analizar su asociación con otras variables, observamos patrones claros que eran los que ya veniamos intuyendo en nuestras hipótesis iniciales.
RECUVOTOG (recuerdo de voto): La gran mayoría de estos valores extremos se concentran entre personas que afirman haber votado a VOX, un partido que habitualmente se posiciona de forma crítica frente al feminismo.
GRADODESIGUALDAD (grado de desigualdad percibida): Los valores bajos en ESCFEMINIS suelen darse entre quienes creen que las desigualdades de género en España son pequeñas o casi inexistentes. Esto tiene sentido, ya que si no se percibe desigualdad, es menos probable que una persona se autodefina como feminista.
GRADACDISC (grado de acuerdo con la afirmación de que se discrimina a los hombres): Aquí también se ve una relación esperada: quienes más de acuerdo están con esta afirmación tienden a tener puntuaciones más bajas en la escala feminista.
VALSALARIOS, VALPOSASC y VALOPEMP (valoraciones sobre si las mujeres están en peor situación en salarios, ascensos y empleo): Los valores de ESCFEMINIS más bajos se asocian con quienes creen que la situación de mujeres y hombres es igual o incluso mejor para ellas. Esto también es lógico: si se percibe que no existe desventaja, es menos probable que se adopte una postura feminista.
SEXO: Aunque hay algún valor 0 tanto en hombres como mujeres, son mucho más frecuentes entre hombres.
Important
Por tanto, no los eliminamos, nos los quedamos, porque sino estaríamos eliminando algo clave que nos ayuda a rebatir el objetivo que tenemos de desmentir la afirmación que sale en El País. Además el porentaje era bastante elevado
Observar donde exactamente están nuestros outliers nos sirve para ver estas relaciones más claras.
data_num[out_ind_f, ]
# A tibble: 346 × 18
SEXO EDAD TAMUNI INGRESHOG TARHOGENTREV_HH HIJOMENOR SITLAB NIVELESTENTREV
<fct> <dbl> <ord> <ord> <dbl> <fct> <fct> <fct>
1 Hombre 60 10000… 2701-390… 1 Ninguno Traba… Doctorado
2 Hombre 21 10001… <NA> 5 Ninguno En pa… FP grado medio
3 Mujer 58 10000… 1801-270… 0 Ninguno Traba… Bachillerato
4 Hombre 85 10000… 2701-390… 0 Ninguno Jubil… Licenciatura
5 Mujer 50 2001-… 1801-270… 6 Tiene hi… Traba… Educación sec…
6 Mujer 39 10000… 2701-390… 1 Tiene hi… Traba… FP grado medio
7 Hombre 44 10001… 3901-500… 2 Ninguno Traba… FP grado supe…
8 Hombre 67 10000… 1100-180… NA Ninguno Jubil… Licenciatura
9 Hombre 65 10000… 2701-390… 3 Ninguno Traba… FP grado supe…
10 Hombre 54 50001… 2701-390… 0 Ninguno Traba… FP grado medio
# ℹ 336 more rows
# ℹ 10 more variables: GRADACDISC <ord>, GRADODESIGUALDAD <ord>,
# VALSALARIOS <ord>, VALPOSASC <ord>, VALOPEMP <ord>, ESCFEMINIS <dbl>,
# ESCIDEOL <dbl>, RELIGION <fct>, CUIDADOHIJOS_HH <dbl>, RECUVOTOG <fct>
Warning: Removed 3003 rows containing non-finite outside the scale range
(`stat_boxplot()`).
Al mirar la variable CUIDADOHIJOS_HH comparada con el resto, vemos que en la mayoría de los casos no parece haber una relación clara. Pero cuando la comparamos con la situación laboral (SITLAB), sí que aparece una cierta asociación. Esto nos hace pensar que esa variable forma parte del comportamiento general de los datos, y por tanto, podríamos estar ante una distribución asimétrica.
Por eso, de momento no la vamos a eliminar, aunque más adelante, cuando hagamos el análisis con el método LOF, podría que nos indique que sí deberíamos quitarla si se comporta como un valor atípico.
Observar donde exactamente están nuestros outliers nos sirve para ver estas relaciones más claras.
data_num[out_ind_ch, ]
# A tibble: 67 × 18
SEXO EDAD TAMUNI INGRESHOG TARHOGENTREV_HH HIJOMENOR SITLAB NIVELESTENTREV
<fct> <dbl> <ord> <ord> <dbl> <fct> <fct> <fct>
1 Mujer 28 10001… Menos de… 3 Tiene hi… En pa… Educación sec…
2 Mujer 33 ≤2000… 2701-390… 2 Tiene hi… Traba… Grado univers…
3 Mujer 31 10001… 1100-180… 3 Tiene hi… En pa… Máster oficial
4 Mujer 28 2001-… <NA> 2 Tiene hi… En pa… Primaria
5 Mujer 32 2001-… 2701-390… 2 Tiene hi… Traba… Máster oficial
6 Hombre 41 10001… 1100-180… 3 Tiene hi… Traba… FP grado medio
7 Mujer 51 40000… 1100-180… 2 Tiene hi… Traba… Títulos propi…
8 Mujer 44 2001-… 2701-390… 2 Tiene hi… Traba… FP grado supe…
9 Mujer 37 50001… 2701-390… 15 Tiene hi… Traba… Diplomaturas …
10 Mujer 29 40000… 2701-390… 7 Tiene hi… Traba… Licenciatura
# ℹ 57 more rows
# ℹ 10 more variables: GRADACDISC <ord>, GRADODESIGUALDAD <ord>,
# VALSALARIOS <ord>, VALPOSASC <ord>, VALOPEMP <ord>, ESCFEMINIS <dbl>,
# ESCIDEOL <dbl>, RELIGION <fct>, CUIDADOHIJOS_HH <dbl>, RECUVOTOG <fct>
data_num[ext_ind_ch, ]
# A tibble: 35 × 18
SEXO EDAD TAMUNI INGRESHOG TARHOGENTREV_HH HIJOMENOR SITLAB NIVELESTENTREV
<fct> <dbl> <ord> <ord> <dbl> <fct> <fct> <fct>
1 Mujer 28 10001… Menos de… 3 Tiene hi… En pa… Educación sec…
2 Mujer 33 ≤2000… 2701-390… 2 Tiene hi… Traba… Grado univers…
3 Mujer 28 2001-… <NA> 2 Tiene hi… En pa… Primaria
4 Hombre 41 10001… 1100-180… 3 Tiene hi… Traba… FP grado medio
5 Mujer 51 40000… 1100-180… 2 Tiene hi… Traba… Títulos propi…
6 Mujer 37 50001… 2701-390… 15 Tiene hi… Traba… Diplomaturas …
7 Mujer 29 40000… 2701-390… 7 Tiene hi… Traba… Licenciatura
8 Mujer 30 10001… 1100-180… 4 Tiene hi… Traba… FP grado medio
9 Mujer 22 10000… 1100-180… 10 Tiene hi… Traba… Bachillerato
10 Mujer 40 2001-… 1100-180… 4 Tiene hi… Traba… Educación sec…
# ℹ 25 more rows
# ℹ 10 more variables: GRADACDISC <ord>, GRADODESIGUALDAD <ord>,
# VALSALARIOS <ord>, VALPOSASC <ord>, VALOPEMP <ord>, ESCFEMINIS <dbl>,
# ESCIDEOL <dbl>, RELIGION <fct>, CUIDADOHIJOS_HH <dbl>, RECUVOTOG <fct>
Detección y tratamiento Multivariante (LOF) ⚙️
LOF es un algoritmo de detección de valores atípicos basado en la proximidad y la densidad.
LOF se centra en encontrar observaciones que se desvíen del patrón de densidad local. Es decir, modela los valores atípicos como puntos que están aislados de los datos restantes. En la práctica, la densidad local se obtiene de los k vecinos más cercanos.
Warning
Cuidado, este algoritmo detecta “Observaciones atípicas”(filas enteras) no “datos atípicos”(Datos sueltos individuales) considerando múltiples variables al mismo tiempo.
Es independiente a lo que acabamos de hacer pero nos puede ayudar a corregir previos fallos por ejemplo si no hemos detectado unos ouliers, alomejor el algoritmo nos recalca que están haciendo raras sus observaciones.
No podemos aplicar el LOF con NA’s, vemos los nas que tenemos.
#paquete skimrdata_num |>skim()
Data summary
Name
data_num
Number of rows
4005
Number of columns
18
_______________________
Column type frequency:
factor
13
numeric
5
________________________
Group variables
None
Variable type: factor
skim_variable
n_missing
complete_rate
ordered
n_unique
top_counts
SEXO
0
1.00
FALSE
2
Hom: 2013, Muj: 1992
TAMUNI
0
1.00
TRUE
7
100: 993, 100: 986, 500: 551, 200: 477
INGRESHOG
187
0.95
TRUE
6
270: 891, 180: 879, 110: 716, 390: 595
HIJOMENOR
8
1.00
FALSE
2
Nin: 2930, Tie: 1067
SITLAB
5
1.00
FALSE
8
Tra: 2373, Jub: 868, En : 300, Est: 176
NIVELESTENTREV
29
0.99
FALSE
16
Lic: 634, Bac: 585, FP : 517, Edu: 492
GRADACDISC
31
0.99
TRUE
5
Nad: 1303, Poc: 1102, Bas: 778, Muy: 754
GRADODESIGUALDAD
102
0.97
TRUE
4
Bas: 1681, Peq: 1044, Muy: 636, Cas: 542
VALSALARIOS
78
0.98
TRUE
3
Peo: 2465, Igu: 1323, Mej: 139
VALPOSASC
81
0.98
TRUE
3
Peo: 2360, Igu: 1297, Mej: 267
VALOPEMP
66
0.98
TRUE
3
Peo: 1851, Igu: 1731, Mej: 357
RELIGION
60
0.99
FALSE
6
Cat: 1372, Ate: 692, Cat: 636, Agn: 592
RECUVOTOG
665
0.83
FALSE
16
PSO: 988, PP: 854, SUM: 524, N.C: 338
Variable type: numeric
skim_variable
n_missing
complete_rate
mean
sd
p0
p25
p50
p75
p100
hist
EDAD
0
1.00
50.02
17.31
16
37
50
63
97
▅▇▇▅▁
TARHOGENTREV_HH
210
0.95
2.37
1.81
0
1
2
3
18
▇▂▁▁▁
ESCFEMINIS
59
0.99
6.27
2.74
0
5
7
8
10
▂▁▆▇▅
ESCIDEOL
218
0.95
4.77
2.52
1
3
5
7
10
▆▇▇▅▂
CUIDADOHIJOS_HH
3003
0.25
5.16
4.95
0
2
4
6
24
▇▅▁▁▁
Vemos que la variable de hijos tiene 3003 nas, no podemos quitarnosla y continuar porque nos quitamos un muy alto porcentaje de la base de datos. Vamos a realizar 2 análisis LOF, uno quitando esa variable y otro incluyendola.
data_num_sin$lof <- lof_resultados #añadimos la variable lof al conjunto de datos original# Los que tienen un LOF mayor de 1.5lof_significativos <- data_num_sin |>filter(lof >1.5) |>relocate(lof, .before ="EDAD") #para que se pueda observar bien en el htmllof_significativos
Este gráfico es útil para entender cómo se distribuyen los outliers en dos variables, pero no refleja todo el análisis de LOF. LOF funciona en el espacio multidimensional, considerando todas las variables al mismo tiempo. Para poder visualizarlo vamos a dejar una variable fija y a representarla de manera bidimensional con el resto de variables(en este caso solo tenemos 4 cuantitativas).
#las cuantitativasggplot(data_num_sin, aes(x = TARHOGENTREV_HH, y = ESCFEMINIS, colour = lof)) +geom_point() +scale_color_gradient(low ="blue", high ="red", name ="LOF Score") +labs(title ="Detección de Valores Atípicos con LOF")
ggplot(data_num_sin, aes(x = ESCIDEOL, y = ESCFEMINIS, colour = lof)) +geom_point() +scale_color_gradient(low ="blue", high ="red", name ="LOF Score") +labs(title ="Detección de Valores Atípicos con LOF")
ggplot(data_num_sin, aes(x = EDAD, y = ESCFEMINIS, colour = lof)) +geom_point() +scale_color_gradient(low ="blue", high ="red", name ="LOF Score") +labs(title ="Detección de Valores Atípicos con LOF")
La escala de color me muestra los LOF MÁS significativos que ahora comentaremos.
data_num_con$lof <- lof_resultados_2 #añadimos la variable lof al conjunto de datos original# Los que tienen un LOF mayor de 1.5lof_significativos_2 <- data_num_con |>filter(lof >1.5) |>relocate(lof, .before ="EDAD") #para que se pueda observar bien en el htmllof_significativos_2
Este gráfico es útil para entender cómo se distribuyen los outliers en dos variables, pero no refleja todo el análisis de LOF. LOF funciona en el espacio multidimensional, considerando todas las variables al mismo tiempo. Para poder visualizarlo vamos a dejar una variable fija y a representarla de manera bidimensional con el resto de variables(en este caso solo tenemos 4 cuantitativas).
#las cuantitativasggplot(data_num_con, aes(x = EDAD, y = ESCFEMINIS, colour = lof)) +geom_point() +scale_color_gradient(low ="blue", high ="red", name ="LOF Score") +labs(title ="Detección de Valores Atípicos con LOF")
ggplot(data_num_con, aes(x = TARHOGENTREV_HH, y = ESCFEMINIS, colour = lof)) +geom_point() +scale_color_gradient(low ="blue", high ="red", name ="LOF Score") +labs(title ="Detección de Valores Atípicos con LOF")
ggplot(data_num_con, aes(x = ESCIDEOL, y = ESCFEMINIS, colour = lof)) +geom_point() +scale_color_gradient(low ="blue", high ="red", name ="LOF Score") +labs(title ="Detección de Valores Atípicos con LOF")
ggplot(data_num_con, aes(x = CUIDADOHIJOS_HH, y = ESCFEMINIS, colour = lof)) +geom_point() +scale_color_gradient(low ="blue", high ="red", name ="LOF Score") +labs(title ="Detección de Valores Atípicos con LOF")
La escala de color me muestra los LOF MÁS significativos que ahora comentaremos.
Conclusiones LOF
Aunque el algoritmo LOF ha detectado algunas observaciones con puntuaciones por encima de 1.5, en ambos análisis (con y sin la variable de cuidado de hijos/as), los valores se mantienen dentro de un rango moderado, moviéndose entre 1.5 y algo más de 2.
#sin hijosmin(lof_significativos$lof)
[1] 1.50238
max(lof_significativos$lof)
[1] 2.00844
#con hijosmin(lof_significativos_2$lof)
[1] 1.502268
max(lof_significativos_2$lof)
[1] 2.37662
Esto significa que, si bien hay observaciones que se alejan ligeramente del patrón general, no encontramos casos extremos que se desmarquen claramente del resto. Por tanto, no consideramos que haya observaciones atípicas graves que deban ser eliminadas.
En vez de eliminar todo lo que supere el umbral de 1.5, lo que hemos hecho es observar cuáles se separan mucho del resto, y al ver que no hay grandes saltos, decidimos mantener todos los casos, ya que aportan información útil.
Aunque no veamos una distancia muy grande entre los valores LOF, vemos que los valores más altos de LOF corresponden a los valores de los extremos de la variable TARHOGARENTREV_HH, la cual hemos decidido que los vamos a quitar. El lof ha sido capaz de corroborar las hipótesis que hemos sacado en el bivariante. Pero no quitaremos toda la observación porque hemos identificado los valores que la están haciendo rara, quitamos esos valores y ya.
Important
Una vez hecho este proceso podemos ya quitar los extremos detectados en el bivariante y confirmados en el lof, los pasamos a na.
Este análisis muestra que solo un 18% de los casos están completos, es decir, sin ningún valor perdido. Eso significa que si nos quedamos solo con los casos completos, perderíamos más del 80% de los datos, lo cual es una barbaridad. Por eso, la imputación es clave
Hemos detectado que la variable recuvotog es mnar ya que muestra una asociación pero no sabemos explicarla del todo. Además si nos fijamos vemos que hay muchos más missings de los que debería haber si solo hubiesemos pasados a nas “no recuerda”. Esto se debe a que el valor cero en esa variable cosrresponde a todos los que no habían votado y no venía especificada en el pdf de las etiquetas y el cuestionario, por lo que en el factor se han ido a nas.
Note
Un mnar depende de variables “ocultas” en los datos que no tenemos en el dataset. Este es un claro ejemplo. En este caso, al disponer de la encuesta entera hemos detectado que estos mnar están relacionados con no haber votado en las últimas elecciones, lo cual viene recogido en otra variable de la encuesta que no está incluida en nuestro dataset.
Menos de 5 años escolarización Primaria
0.005992509 0.039200999
FP básica Educación secundaria
0.003495630 0.122846442
FP grado medio Bachillerato
0.067665418 0.146067416
FP grado superior Arquitectura/ingeniería técnica
0.129088639 0.018976280
Diplomaturas oficiales Grado universitario
0.071161049 0.061173533
Licenciatura Arquitectura/ingeniería
0.158302122 0.030961298
Máster oficial Doctorado
0.093383271 0.023470662
Títulos propios posgrado Otros estudios
0.012234707 0.008739076
<NA>
0.007240949
#sustituimos los NAs por el valor mas repetido, la modadata_num$NIVELESTENTREV_imp <-data_num$NIVELESTENTREVdata_num$NIVELESTENTREV_imp[is.na(data_num$NIVELESTENTREV_imp)] <-"Licenciatura"prop.table(table(data_num$GRADACDISC,useNA ="always"))
Nada de acuerdo Poco de acuerdo Regular Bastante de acuerdo
0.325343321 0.275156055 0.009238452 0.194257179
Muy de acuerdo <NA>
0.188264669 0.007740325
#sustituimos los NAs por el valor mas repetido, la modadata_num$GRADACDISC_imp <-data_num$GRADACDISCdata_num$GRADACDISC_imp[is.na(data_num$GRADACDISC_imp)] <-"Nada de acuerdo"prop.table(table(data_num$GRADODESIGUALDAD,useNA ="always"))
Casi inexistentes Pequeñas Bastante grandes Muy grandes
0.13533084 0.26067416 0.41972534 0.15880150
<NA>
0.02546816
#sustituimos los NAs por el valor mas repetido, la modadata_num$GRADODESIGUALDAD_imp <-data_num$GRADODESIGUALDADdata_num$GRADODESIGUALDAD_imp[is.na(data_num$GRADODESIGUALDAD_imp)] <-"Bastante grandes"prop.table(table(data_num$VALSALARIOS,useNA ="always"))
Peor Igual Mejor <NA>
0.61548065 0.33033708 0.03470662 0.01947566
#sustituimos los NAs por el valor mas repetido, la modadata_num$VALSALARIOS_imp <-data_num$VALSALARIOSdata_num$VALSALARIOS_imp[is.na(data_num$VALSALARIOS_imp)] <-"Peor"prop.table(table(data_num$VALPOSASC,useNA ="always"))
Peor Igual Mejor <NA>
0.58926342 0.32384519 0.06666667 0.02022472
#sustituimos los NAs por el valor mas repetido, la modadata_num$VALPOSASC_imp <-data_num$VALPOSASCdata_num$VALPOSASC_imp[is.na(data_num$VALPOSASC_imp)] <-"Peor"prop.table(table(data_num$VALOPEMP,useNA ="always"))
Peor Igual Mejor <NA>
0.46217228 0.43220974 0.08913858 0.01647940
#sustituimos los NAs por el valor mas repetido, la modadata_num$VALOPEMP_imp <-data_num$VALOPEMPdata_num$VALOPEMP_imp[is.na(data_num$VALOPEMP_imp)] <-"Peor"
vis_miss(data_num)
Aquí vemos como la imputación por la moda para estas variables cualitativas a funcionado pues ninguna de las imputadas presenta ningún ausente en el vis_miss.
Tras la elaboración de los gráficos correspondientes a las tres variables continuas analizadas, se ha llegado a una conclusión común: los datos faltantes en estas variables parecen corresponderse con un mecanismo de tipo MCAR (Missing Completely At Random). Esta conclusión se fundamenta en que no se observa una relación evidente entre la ausencia de datos y otras variables del conjunto; es decir, los datos faltantes son independientes del resto de la información disponible.
Esta independencia se evidencia claramente en los margin plots, donde los boxplots se mantienen a una altura similar en las comparaciones, indicando que la distribución de los valores observados no cambia en función de la presencia o ausencia de datos. Aunque en algunos gráficos pueden percibirse ligeras asociaciones, un análisis más detallado revela que estas se deben a una mayor concentración general de observaciones en ciertas zonas del gráfico, y no a una relación directa con la falta de datos. Por lo tanto, concluimos que no existe una asociación sistemática que explique los valores faltantes.
Como estamos con variables continuas con un un bajo % de missings vamos a imputar por la media.
#TARHOGENTREV_HHggplot(data_num) +geom_density(aes(x = TARHOGENTREV_HH, fill ="Original"), alpha =0.5) +geom_density(aes(x = TARHOGENTREV_HH_media, fill ="Imputado"), alpha =0.5) +scale_fill_manual(values =c("Original"="blue", "Imputado"="red")) +labs(title ="Comparación de densidades: Original vs. Imputado", x ="TARHOGENTREV_HH", y ="Densidad", fill ="Tipo de dato") +theme_minimal()
Warning: Removed 244 rows containing non-finite outside the scale range
(`stat_density()`).
#ESCFEMINISggplot(data_num, aes(x = ESCFEMINIS, fill ="Age")) +geom_density(alpha =0.5) +geom_density(aes(x = ESCFEMINIS_MEDIA, fill ="Age_media"),alpha=0.5)
Warning: Removed 59 rows containing non-finite outside the scale range
(`stat_density()`).
#ESCIDEOLggplot(data_num, aes(x = ESCIDEOL, fill ="ESCIDEOL")) +geom_density(alpha =0.5) +geom_density(aes(x = ESCIDEOL_media, fill ="ESCIDEOL_media"),alpha=0.5)
Warning: Removed 218 rows containing non-finite outside the scale range
(`stat_density()`).
En los gráficos presentados se comparan las distribuciones originales de las variables con las distribuciones resultantes tras la imputación. Se observa que, en todo momento, ambas se ajustan de forma bastante precisa, lo que indica que el proceso de imputación ha sido adecuado. Las imputaciones realizadas no alteran significativamente el comportamiento ni la forma de la distribución original, lo cual sugiere que los valores imputados mantienen la coherencia con los datos observados y no introducen sesgos visibles en la estructura de los datos.
Imputación Múltiple
Las variables cualitativas con un porcentaje de valores perdidos superior al 5% serán imputadas mediante el algoritmo MICE (Multiple Imputation by Chained Equations), dado que permite una imputación adecuada respetando la naturaleza categórica de los datos.
# Graficar la distribución de la variable categórica antes y después de la imputaciónpar(mfrow =c(1, 2)) # Organizar las gráficas en una fila de 2 columnasbarplot(table(data_num$INGRESHOG, useNA ="ifany"), main ="Antes de la imputación")barplot(table(completeData$INGRESHOG), main ="Después de la imputación")
# Graficar la distribución de la variable categórica antes y después de la imputaciónpar(mfrow =c(1, 2)) # Organizar las gráficas en una fila de 2 columnasbarplot(table(data_num$RECUVOTOG, useNA ="ifany"), main ="Antes de la imputación")barplot(table(completeData$RECUVOTOG), main ="Después de la imputación")
Así es como nos quedaría la variable imputada. Vemos que no estamos distorsionando su distribución. Basatante bien.